#ifndef MEPA_H_
#define MEPA_H_
#include <stdio.h>
#include <vector>
#include <string>
#include "NoArvore.h"
#include "Arquivo.h" //manipulacao do arquivo de saida

using namespace std;

class Mepa
{
public:
	Mepa(NoArvore &);
	Mepa();
	virtual ~Mepa();
	void IniciaProgramaPrincipal();
	void AlocarMemoria(int);
	void Para();
	void ArmazenarValor(int, int);
	void DesviarSempre(int);
	void DesvioFalso(int);
	void Nada();
	void Leitura();
	void Imprimir();
	void Println();
	void ImprimeCaractere();
	void CarregaConstante(int );
	void CarregaValor(int, int);
	void Soma();
	void Subtrai();
	void Multiplica();
	void Divide();
	void InverterSinal();
	void Nega(); //(NEGA��O)
	void ComparaMenor(); // compara qual o menor elemento
	void ComparaMaior(); 
	void ComparaIgual();
	void ComparaDesigual();
	void ComparaMenorIgual();
	void ComparaMaiorIgual();
	void Disjuncao();
	void Conjuncao(); 
	void ChamarProcedimento(int);
	void EntrarProcedimento(int);
	void RetornarProcedimento(int, int);
	void DesalocaMemoria(int);
	void CarregarValorIndireto(int, int);
	void ArmazenarValorIndireto(int, int);
	void CarregarEndereco(int, int);
	void MostrarMemoria();
private:
	vector<string> mP; //regiao de programa que contem instrucoes da mepa
	vector<string> mM; //regiao de dados que contem valores manipulados pelas instrucoes da mepa
	vector<int> mD; //vetor de registradores base, contendo apontadores para regiao M
	int mI; //endereco da proxima instrucao a ser executada
	int mS; //endereco do topo da pilha
	NoArvore mArvoreSintatica;//arvore recebida do sintatico
	Arquivo mArquivoSaida; //manipulacao do arquivo de saida, traduzido de pascal para mepa
};

#endif /*MEPA_H_*/
